From 79b280df480bcffc476f95786d50c2d9d3187c28 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 7 Apr 2005 08:01:29 +0000 Subject: [PATCH] bitkeeper revision 1.1282 (4254e8d92URVK0d-Uc-p1l7ymBS-HA) A few x86/64 cleanups. Signed-off-by: Keir Fraser --- xen/arch/x86/domain.c | 16 ++++++++-------- xen/arch/x86/x86_64/mm.c | 20 ++++++++++++-------- xen/include/asm-x86/config.h | 1 + xen/include/asm-x86/x86_64/asm_defns.h | 4 ++++ xen/include/asm-x86/x86_64/page.h | 9 --------- xen/include/xen/shadow.h | 2 +- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 322181ffdb..6508103c28 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -516,7 +516,7 @@ void new_thread(struct exec_domain *d, void toggle_guest_mode(struct exec_domain *ed) { ed->arch.flags ^= TF_kernel_mode; - __asm__ __volatile__ ( "mfence; swapgs" ); /* AMD erratum #88 */ + __asm__ __volatile__ ( "swapgs" ); update_pagetables(ed); write_ptbase(ed); } @@ -600,7 +600,7 @@ static void load_segments(struct exec_domain *p, struct exec_domain *n) /* If in kernel mode then switch the GS bases around. */ if ( n->arch.flags & TF_kernel_mode ) - __asm__ __volatile__ ( "mfence; swapgs" ); /* AMD erratum #88 */ + __asm__ __volatile__ ( safe_swapgs ); if ( unlikely(!all_segs_okay) ) { @@ -651,12 +651,12 @@ static void save_segments(struct exec_domain *p) static void clear_segments(void) { __asm__ __volatile__ ( - "movl %0,%%ds; " - "movl %0,%%es; " - "movl %0,%%fs; " - "movl %0,%%gs; " - "mfence; swapgs; " /* AMD erratum #88 */ - "movl %0,%%gs" + " movl %0,%%ds; " + " movl %0,%%es; " + " movl %0,%%fs; " + " movl %0,%%gs; " + ""safe_swapgs" " + " movl %0,%%gs" : : "r" (0) ); } diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index d56b02fdba..79d443942a 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -248,31 +249,33 @@ long do_stack_switch(unsigned long ss, unsigned long esp) long do_set_segment_base(unsigned int which, unsigned long base) { struct exec_domain *ed = current; - - base = canonicalise_virt_address(base); + long ret = 0; switch ( which ) { case SEGBASE_FS: ed->arch.user_ctxt.fs_base = base; - wrmsr(MSR_FS_BASE, base, base>>32); + if ( wrmsr_user(MSR_FS_BASE, base, base>>32) ) + ret = -EFAULT; break; case SEGBASE_GS_USER: ed->arch.user_ctxt.gs_base_user = base; - wrmsr(MSR_SHADOW_GS_BASE, base, base>>32); + if ( wrmsr_user(MSR_SHADOW_GS_BASE, base, base>>32) ) + ret = -EFAULT; break; case SEGBASE_GS_KERNEL: ed->arch.user_ctxt.gs_base_kernel = base; - wrmsr(MSR_GS_BASE, base, base>>32); + if ( wrmsr_user(MSR_GS_BASE, base, base>>32) ) + ret = -EFAULT; break; case SEGBASE_GS_USER_SEL: __asm__ __volatile__ ( " swapgs \n" "1: movl %k0,%%gs \n" - " mfence; swapgs \n" /* AMD erratum #88 */ + " "safe_swapgs" \n" ".section .fixup,\"ax\" \n" "2: xorl %k0,%k0 \n" " jmp 1b \n" @@ -285,10 +288,11 @@ long do_set_segment_base(unsigned int which, unsigned long base) break; default: - return -EINVAL; + ret = -EINVAL; + break; } - return 0; + return ret; } diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h index 84a0492e1d..c795763488 100644 --- a/xen/include/asm-x86/config.h +++ b/xen/include/asm-x86/config.h @@ -12,6 +12,7 @@ #endif #define CONFIG_X86 1 +#define CONFIG_SHADOW 1 #define CONFIG_SMP 1 #define CONFIG_X86_LOCAL_APIC 1 diff --git a/xen/include/asm-x86/x86_64/asm_defns.h b/xen/include/asm-x86/x86_64/asm_defns.h index 3ac95024cc..d5f0e5b6ad 100644 --- a/xen/include/asm-x86/x86_64/asm_defns.h +++ b/xen/include/asm-x86/x86_64/asm_defns.h @@ -39,6 +39,10 @@ "popq %rsi;" \ "popq %rdi;" +/* Work around AMD erratum #88 */ +#define safe_swapgs \ + "mfence; swapgs;" + #else #define SAVE_ALL \ diff --git a/xen/include/asm-x86/x86_64/page.h b/xen/include/asm-x86/x86_64/page.h index d4731b65f4..029635e3bf 100644 --- a/xen/include/asm-x86/x86_64/page.h +++ b/xen/include/asm-x86/x86_64/page.h @@ -98,15 +98,6 @@ typedef l4_pgentry_t root_pgentry_t; #define L3_DISALLOW_MASK ((cpu_has_nx?0:(1UL<<63)) | (7UL << 7)) #define L4_DISALLOW_MASK ((cpu_has_nx?0:(1UL<<63)) | (7UL << 7)) -#ifndef __ASSEMBLY__ -static inline unsigned long canonicalise_virt_address(unsigned long v) -{ - v &= VADDR_MASK; - if ( v & (1UL << (VADDR_BITS - 1)) ) - v |= ~VADDR_MASK; -} -#endif /* !__ASSEMBLY__ */ - #endif /* __X86_64_PAGE_H__ */ /* diff --git a/xen/include/xen/shadow.h b/xen/include/xen/shadow.h index 8379d4fd45..a69bd59802 100644 --- a/xen/include/xen/shadow.h +++ b/xen/include/xen/shadow.h @@ -4,7 +4,7 @@ #include -#ifdef CONFIG_X86 +#ifdef CONFIG_SHADOW #include -- 2.30.2